数据库即代码| 使用Bytebase的数据库GitOps实践
先说下笔者的体验后的感受,非常惊喜!通过Bytebase GitOps的实践方式完成SQL变更,当SQL文件被修改或者新建会同步Bytebase工单完成SQL变更。还会将当前数据库的Schema LATEST SQL存放到GITHUB仓库中。
记得19年的时候我们在做DevOps项目评估和实施的时候SQL变更是个难题。当时并没有太合适的SQL平台可以使用,后来我们要求开发人员写的SQL要具有幂等性并将变更的SQL填写到代码库固定的目录位置,然后CI/CD流水线会进行变更。CI/CD流水线检测到SQL文件变化会以Input的方式弹出让用户选择是否进行SQL变更。
笔者将自己使用Bytebase产品体验的过程做了简单整理,分享:
1. 环境准备
本地MySQL数据库集群; 一个GitHub账户; 一个公开的仓库; Docker本地安装Bytebase; Ngrok 账户使用反向代理接收GitHub的WebHook;
由于本地部署的Bytebase产品无法通过GITHUB链接, 这里使用Ngrok隧道工具实现转发。如果是生产环境建议使用Caddy实现。当让如果在公网环境部署Bytebase产品可以跳过代理工具的配置。笔者是在本地部署的顺便将代理的配置过程也做了整理。
2. 获取Ngrok URL
注意Ngrok需要开启代理才能访问。注册Ngrok 账号 https://dashboard.ngrok.com/ 下载ngrok, 根据实际环境下载对应版本的Ngrok。如图所示。
ngrok config add-authtoken 1o6O3ur1sBElTPLLEeG9uTAE7aw_JD3tGF4KCMBHbneog3Tz
后面计划将Bytebase产品以Docker的方式部署,并通过http://localhost:5678
进行访问。所以通过命令ngrok http 5678
开启代理隧道。获取公网URL https://262d-2409-8a00-242d-ab60-f4b8-70a1-71e3-1c2b.ap.ngrok.io
如图所示。(目前不用尝试访问这个URL,因为后面产品还没部署)
3. 部署Bytebase
以下是docker-compose.yaml代码,注意bytebase
容器的command
值。添加"--external-url", "https://262d-2409-8a00-242d-ab60-f4b8-70a1-71e3-1c2b.ap.ngrok.io"
version: "3.7"
services:
bytebase:
image: bytebase/bytebase:1.12.1
init: true
container_name: bytebase
restart: always
ports:
- 5678:5678
# # Uncomment the following lines to persist data
# volumes:
# - ~/.bytebase/data:/var/opt/bytebase
command: ["--data", "/var/opt/bytebase", "--port", "5678", "--external-url", "https://262d-2409-8a00-242d-ab60-f4b8-70a1-71e3-1c2b.ap.ngrok.io"]
employee-prod:
image: bytebase/sample-database:mysql-employee-small
ports:
- 3306:3306
employee-test:
image: bytebase/sample-database:mysql-employee-small
ports:
- 3307:3306
通过docker-compose up -d
启动容器, 等待产品启动完成访问https://262d-2409-8a00-242d-ab60-f4b8-70a1-71e3-1c2b.ap.ngrok.io
进入Bytebase产品首页,如图所示。(第一次部署需要注册管理员账号)
4. 平台配置GitOps
导航到“设置”,选择GitOps进入配置页面,如图所示。
上图中的应用ID和Secret信息,需要在GitHub中创建OAuth APP
后获取。
Homepage URL: 复制上图中的Homepage URL; Authorization callback URL: 复制上图中的Authorization URL;
进入GitHub OAuth Apps
创建,如图所示。
创建应用后将应用ID和Secret填写到设置中,单击“ 下一步”。
跳转到GitHub Authorize 页面, 单击Authorize terraform-group。
Authorize完成后自动跳转到步骤3,确认信息并添加。
添加成功,到此完成GitOps与GitHub集成的配置。如图所示。
5. 项目开启GitOps
当配置好平台的GitOps集成后,还需要进入项目中为项目开启GitOps。导航到项目页面,然后进入GitOps设置
。开启GitOps工作流
如图所示。
选择Git提供方, 单击GitHub.com。
同步仓库信息,用户选择要关联GitOps变更的仓库。
关联好项目成功后,需要配置变更SQL文件的目录结构和命令规范。
分支:默认main分支; 根目录:检测SQL文件变更的目录,默认bytebase; 文件路径模板:/bytebase/{{ENV_NAME}}/{{DB_NAME}}##{{VERSION}}##{{TYPE}}##{{DESC}}.sql ENV_NAME 环境名称; DB_NAME:数据库名称; VERSION:版本号; TYPE: SQL类型 DDL; DESC: 描述 Schema路径模板:每次变更后会把最新的Schema存放到的具体路径;
到此,完成GitOps设置。
6. 提交SQL变更代码
创建SQL文件bytebase/Test/employee##202302071000##ddl##create_table.sql
上面截图中目录环境命名错误,应该是大写的T,以实际环境名称为准。
SQL代码:
CREATE TABLE subject
(
id BIGINT NOT NULL,
course VARCHAR(255)
);
提交代码后,返回Bytebase项目首页,可以看到捕获到了Push事件。如图所示。
进入issue 工单页面,可以看到变更的执行情况和变更的SQL语句等信息。如图所示。
进入“查看变更“,可以看到变更内容。如图所示。
此时,返回到GitHub仓库目录可以看到最新版本的数据库Schema已经生成。如图所示。
7. 再次变更
提交SQL代码,对上次变更的表subject
添加字段。
查看提交变更产生的工单。如图所示。
进入issue 工单页面,可以看到变更的执行情况和变更的SQL语句等信息。如图所示。
查进入“查看变更“,可以看到变更内容。如图所示。
查看LATEST版本的SQL文件,已经发生了变化。
往期推荐
初体验| 使用Bytebase进行数据库CI/CD变更
2023 企业实施DevOps的价值有哪些?
DevOps与GitOps方法论的区别和常用工具
CI/CD Isn't Just About Efficiency -CI/CD 不仅关乎效率-简而言之,CI/CD应使我们快乐